package org.vaadin.touchkit.gwt.client.communication;
import static org.vaadin.touchkit.gwt.client.offlinemode.OfflineMode.ActivationReason.BAD_RESPONSE;
import static org.vaadin.touchkit.gwt.client.offlinemode.OfflineMode.ActivationReason.SERVER_AVAILABLE;
import org.vaadin.touchkit.gwt.client.offlinemode.OfflineModeEntrypoint;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.http.client.Request;
import com.google.gwt.http.client.Response;
import com.vaadin.client.communication.ConnectionStateHandler;
import com.vaadin.client.communication.DefaultConnectionStateHandler;
import com.vaadin.client.communication.PushConnection;
import com.vaadin.client.communication.XhrConnectionError;
import elemental.json.JsonObject;
/**
* Custom {@link ConnectionStateHandler} for TouchKit.
*
* If offline is not enabled it behaves like
* {@link DefaultConnectionStateHandler}
*
* Otherwise it dispatches the correct activation or deactivation reason for
* offline mode
*/
public class TouchKitConnectionStateHandler extends
DefaultConnectionStateHandler {
private OfflineModeEntrypoint offlineModeEntrypoint = OfflineModeEntrypoint
.get();
@Override
public void heartbeatException(Request request, Throwable exception) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.heartbeatException(request, exception);
} else {
offlineModeEntrypoint.dispatch(BAD_RESPONSE);
}
}
@Override
public void heartbeatInvalidStatusCode(Request request, Response response) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.heartbeatInvalidStatusCode(request, response);
} else {
offlineModeEntrypoint.dispatch(BAD_RESPONSE);
}
}
@Override
public void heartbeatOk() {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.heartbeatOk();
} else {
offlineModeEntrypoint.dispatch(SERVER_AVAILABLE);
}
}
@Override
public void pushClosed(PushConnection pushConnection,
JavaScriptObject response) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.pushClosed(pushConnection, response);
} else if (pushConnection.isBidirectional()) {
offlineModeEntrypoint.dispatch(BAD_RESPONSE);
} else {
// don't care about long polling as xhr is used for client -> server
}
}
@Override
public void pushClientTimeout(PushConnection pushConnection,
JavaScriptObject response) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.pushClientTimeout(pushConnection, response);
} else if (pushConnection.isBidirectional()) {
offlineModeEntrypoint.dispatch(BAD_RESPONSE);
} else {
// don't care about long polling as xhr is used for client -> server
}
}
@Override
public void pushError(PushConnection pushConnection,
JavaScriptObject response) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.pushError(pushConnection, response);
} else if (pushConnection.isBidirectional()) {
offlineModeEntrypoint.dispatch(BAD_RESPONSE);
} else {
// don't care about long polling as xhr is used for client -> server
}
}
@Override
public void pushReconnectPending(PushConnection pushConnection) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.pushReconnectPending(pushConnection);
} else if (pushConnection.isBidirectional()) {
offlineModeEntrypoint.dispatch(BAD_RESPONSE);
} else {
// don't care about long polling as xhr is used for client -> server
}
}
@Override
public void pushOk(PushConnection pushConnection) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.pushOk(pushConnection);
} else if (pushConnection.isBidirectional()) {
OfflineModeEntrypoint.get().dispatch(SERVER_AVAILABLE);
} else {
// don't care about long polling as xhr is used for client -> server
}
}
@Override
public void xhrException(XhrConnectionError xhrConnectionError) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.xhrException(xhrConnectionError);
} else {
offlineModeEntrypoint.dispatch(BAD_RESPONSE);
getConnection().getMessageSender().endRequest();
}
}
@Override
public void xhrInvalidContent(XhrConnectionError xhrConnectionError) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.xhrInvalidContent(xhrConnectionError);
} else {
offlineModeEntrypoint.dispatch(BAD_RESPONSE);
getConnection().getMessageSender().endRequest();
}
}
@Override
public void xhrInvalidStatusCode(XhrConnectionError xhrConnectionError) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.xhrInvalidStatusCode(xhrConnectionError);
} else {
offlineModeEntrypoint.dispatch(BAD_RESPONSE);
getConnection().getMessageSender().endRequest();
}
}
@Override
public void xhrOk() {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.xhrOk();
} else {
offlineModeEntrypoint.dispatch(SERVER_AVAILABLE);
}
}
@Override
public void pushNotConnected(JsonObject payload) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.pushNotConnected(payload);
} else {
offlineModeEntrypoint.dispatch(BAD_RESPONSE);
}
}
@Override
public void pushInvalidContent(PushConnection pushConnection, String message) {
if (!offlineModeEntrypoint.isOfflineModeEnabled()) {
super.pushInvalidContent(pushConnection, message);
} else if (pushConnection.isBidirectional()) {
offlineModeEntrypoint.dispatch(BAD_RESPONSE);
getConnection().getMessageSender().endRequest();
} else {
// don't care about long polling as xhr is used for client -> server
}
}
}